| |
Работа с полями объекта Recordset в ADO/VBA, коллекция Fields и объекты Field, свойства Name и Value
Главное содержание Recordset - это то, что лежит в ячейках на пересечении строк (в Recordset они называются записями - records и представлены соответствующими объектами Record) и столбцов. В Recordset столбцы называются полями - объектами Field, которые сведены в коллекцию Fields. Объекты Record используются нечасто - поскольку имен у них нет, а переходить между записями проще при помощи свойств и методов самого объекта Recordset - AbsolutePosition, Find(), Move() и т.п. Коллекция же Fields и объекты Field используются практически в каждой программе.
У коллекции Fields все свойства стандартные, как у каждого объекта Collection:
- Count - сколько всего столбцов в Recordset
- Item - возможность вернуть нужный столбец (объект Field) по имени или номеру. Поскольку это свойство является свойством по умолчанию, то можно использовать код, как в нашем примере: rs.Fields("CompanyName"). Есть еще один вариант синтаксиса для обращения к этому свойству:
rs!CompanyName
Методы же имеются как стандартные, так и специфические:
- Append() - возможность добавить новый столбец в Recordset. Delete() - соответственно, удалить столбец. Обе команды разрешено выполнять только на закрытом Recordset (пока не был вызван метод Open() или установлено свойство ActiveConnection).
- Update() - сохранить изменения, внесенные в Recordset (будет произведена попытка создать новый столбец на источнике данных, если источник данных по каким-то причинам принимать эти изменения отказался, возникнет ошибка), CancelUpdate() - отменить изменения, внесенные в Recordset.
- Refresh() - загадочный метод, который ничего не делает (о чем честно написано в документации). Обновить структуру Recordset данными с источника можно только методами самого объекта Recordset.
- Resync() - работает только для коллекции Fields объекта Record (не Recordset), обновляя значения в строке.
Намного больше интересных свойств у объекта Field:
- ActualSize - реальный размер данных для текущей записи, DefinedSize - номинальный размер данных для столбца (в байтах), в соответствии с полученной с источника информацией.
- Attributes - возможность определить битовую маску для атрибутов столбца (допускает ли пустые значения, можно ли использовать отрицательные значения, можно ли обновлять, используется ли тип данных фиксированной длины и т.п.)
- Name - просто строковое имя столбца. Для столбцов, полученных с источника, доступно только на чтение.
- NumericScale и Precision - значения, которые определяют соответственно допустимое количество знаков после запятой и общее максимальное количество цифр, которое можно использовать для представления значения.
- Value - самое важное свойство объекта Field. Определяет значение, которое есть в столбце (если мы пришли через коллекцию Fields объекта Record, то для этой записи, если через Fields объекта Recordset - то для текущей записи). Пример применения - в нашей строке для поиска. Доступно и на чтение, и на запись (в зависимости от типа указателя). ADO позволяет работать с большими двоичными данными (изображения, документы, архивы), что очень удобно. OriginalValue - значение, которое было в этом столбце до начала изменений, UnderlyingValue - значение, которое находится на источнике данных (пока мы работали с Recordset, оно могло быть изменено другой транзакцией, и поэтому OriginalValue и UnderlyingValue могут не совпадать). Свойство Value - это свойство по умолчанию, поэтому эти две строки равноценны:
Debug.Print rs.Fields("CompanyName")
Debug.Print rs.Fields("CompanyName").Value
- Status - значение, отличное от adFieldOK (значение 0) означает, что поле было недавно программно добавлено в Recordset или при добавлении возникла ошибка на источнике данных.
- Type - тип данных в соответствии с приведенной в документации таблицей. Например, для типа данных nvarchar возвращается 202.
У объекта Field есть только два метода - AppendChunk() и GetChunk(). Оба этих метода используются только для работы с большими двоичными типами данных (изображениями, документами и т.п.), когда работать обычными способами через свойство Value не получается.
| |
 |
|